package colorstyle

import (
	"fmt"
	"gitee.com/chenwitt/photographcover/utils"
	"github.com/EdlinOrg/prominentcolor"
	"image"
	"strconv"
	"strings"
)

// key 色号 value 中文描述，1对1
var colorMap = map[string]string{
	"331": "浅棕色",
	"211": "深棕色",
	"321": "棕色",
	"332": "浅棕色",
	"322": "棕色",
	"443": "浅棕色",
	"433": "浅棕色",
	"305": "紫色",
	"404": "紫色",
	"405": "紫色",
	"505": "紫色",
	"220": "深棕色",
	"330": "浅棕色",
	"210": "深棕色",
	"221": "深棕色",
	"320": "棕色",
	"323": "浅紫色",
	"203": "深紫色",
	"324": "浅紫色",
	"423": "浅紫色",
	"445": "浅紫色",
	"204": "深紫色",
	"303": "紫色",
	"325": "浅紫色",
	"424": "浅紫色",
	"205": "深紫色",
	"304": "紫色",
	"403": "紫色",
	"425": "浅紫色",
	"212": "深紫色",
	"213": "深紫色",
	"334": "浅紫色",
	"214": "深紫色",
	"313": "紫色",
	"335": "浅紫色",
	"434": "浅紫色",
	"215": "深紫色",
	"314": "紫色",
	"413": "紫色",
	"435": "浅紫色",
	"315": "紫色",
	"414": "紫色",
	"415": "紫色",
	"244": "浅蓝色",
	"145": "浅蓝色",
	"344": "浅蓝色",
	"245": "浅蓝色",
	"223": "浅蓝色",
	"345": "浅蓝色",
	"224": "浅蓝色",
	"034": "浅蓝色",
	"035": "浅蓝色",
	"134": "浅蓝色",
	"135": "浅蓝色",
	"234": "浅蓝色",
	"235": "浅蓝色",
	"025": "蓝色",
	"124": "蓝色",
	"004": "蓝色",
	"125": "蓝色",
	"115": "蓝色",
	"014": "蓝色",
	"024": "蓝色",
	"005": "蓝色",
	"104": "蓝色",
	"105": "蓝色",
	"123": "蓝色",
	"015": "蓝色",
	"114": "蓝色",
	"003": "深蓝色",
	"102": "深蓝色",
	"012": "深蓝色",
	"103": "深蓝色",
	"013": "深蓝色",
	"112": "深蓝色",
	"113": "深蓝色",
	"023": "深蓝色",
	"002": "深蓝色",
	"453": "浅绿色",
	"454": "浅绿色",
	"354": "浅绿色",
	"353": "浅绿色",
	"452": "浅绿色",
	"352": "浅绿色",
	"451": "浅绿色",
	"351": "浅绿色",
	"450": "浅绿色",
	"350": "浅绿色",
	"243": "绿色",
	"242": "绿色",
	"253": "绿色",
	"254": "绿色",
	"153": "绿色",
	"252": "绿色",
	"053": "绿色",
	"152": "绿色",
	"251": "绿色",
	"241": "绿色",
	"042": "绿色",
	"240": "绿色",
	"041": "绿色",
	"040": "绿色",
	"052": "绿色",
	"151": "绿色",
	"250": "绿色",
	"051": "绿色",
	"150": "绿色",
	"050": "绿色",
	"343": "深绿色",
	"342": "深绿色",
	"022": "深绿色",
	"341": "深绿色",
	"021": "深绿色",
	"340": "深绿色",
	"020": "深绿色",
	"032": "深绿色",
	"031": "深绿色",
	"030": "深绿色",
	"225": "深青色",
	"045": "青色",
	"144": "深青色",
	"122": "深青色",
	"143": "深青色",
	"121": "深青色",
	"044": "深青色",
	"142": "青色",
	"043": "青色",
	"120": "深青色",
	"141": "青色",
	"140": "青色",
	"455": "浅青色",
	"355": "浅青色",
	"255": "浅青色",
	"233": "深青色",
	"155": "浅青色",
	"232": "深青色",
	"133": "深青色",
	"154": "浅青色",
	"132": "青色",
	"055": "青色",
	"231": "深青色",
	"033": "深青色",
	"131": "青色",
	"054": "青色",
	"230": "深青色",
	"130": "青色",
	"543": "浅黄色",
	"553": "浅黄色",
	"542": "深黄色",
	"552": "浅黄色",
	"541": "深黄色",
	"551": "黄色",
	"540": "深黄色",
	"550": "黄色",
	"532": "橙色",
	"422": "深橙色",
	"531": "橙色",
	"432": "深橙色",
	"421": "深橙色",
	"442": "浅橙色",
	"302": "浅红色",
	"530": "橙色",
	"431": "深橙色",
	"420": "深橙色",
	"441": "浅橙色",
	"430": "深橙色",
	"440": "浅橙色",
	"502": "浅红色",
	"512": "浅红色",
	"402": "浅红色",
	"501": "红色",
	"522": "浅红色",
	"412": "浅红色",
	"511": "红色",
	"500": "红色",
	"401": "红色",
	"521": "浅红色",
	"312": "浅红色",
	"510": "红色",
	"411": "红色",
	"400": "红色",
	"301": "深红色",
	"202": "深红色",
	"520": "浅红色",
	"410": "红色",
	"311": "深红色",
	"300": "深红色",
	"201": "深红色",
	"514": "深粉色",
	"503": "深粉色",
	"515": "深粉色",
	"504": "深粉色",
	"554": "白色",
	"555": "白色",
	"545": "白色",
	"310": "深红色",
	"200": "深红色",
	"444": "灰色",
	"333": "灰色",
	"222": "灰色",
	"111": "黑色",
	"525": "粉色",
	"513": "深粉色",
	"524": "粉色",
	"535": "浅粉色",
	"523": "粉色",
	"534": "浅粉色",
	"533": "粉色",
	"544": "浅粉色",
	"010": "黑色",
	"101": "黑色",
	"000": "黑色",
	"011": "黑色",
	"110": "黑色",
	"001": "黑色",
	"100": "黑色",
}

// key 中文描述 value 色号列表， 1对多
var colorMap2 = map[string][]string{}

// 背景色搭配字体颜色，key,value全是色号
var backgroundFontColorMap = map[string][]string{}

// ExtractColor 提取核心颜色
func ExtractColor(img image.Image) string {
	colours, err := prominentcolor.Kmeans(img)
	if err != nil {
		panic("Failed to process image")
	}
	r := 0
	g := 0
	b := 0
	for _, colour := range colours {
		r += int(colour.Color.R)
		g += int(colour.Color.G)
		b += int(colour.Color.B)
	}
	colorCode := fmt.Sprintf("%d%d%d", r/3/51, g/3/51, b/3/51)
	return colorCode
}

// TransformColor 颜色编码转rgb数组
func TransformColor(colorCode string) []int {
	rgb := strings.Split(colorCode, "")
	var rgbarr []int
	for _, value := range rgb {
		tem, err := strconv.Atoi(value)
		if err != nil {
			panic(err)
		}
		rgbarr = append(rgbarr, tem*51)
	}
	return rgbarr
}

// FontColorMatch 匹配字体颜色
func FontColorMatch(bgColorCode string) (colorCode string) {
	colorArr := backgroundFontColorMap[bgColorCode]
	if len(colorArr) > 0 {
		index := utils.RandomInt(0, len(colorArr))
		return colorArr[index]
	}
	return ""
}

func InitColor() {
	for key, value := range colorMap {
		tem := colorMap2[value]
		tem = append(tem, key)
		colorMap2[value] = tem
	}
	for key := range colorMap2 {
		// 白色背景
		bgWhiteFont(key)
		// 棕色背景
		bgBrownFont(key)
		// 粉色背景
		bgPinkFont(key)
		// 紫色背景
		bgPurpleFont(key)
		// 橙色背景
		bgOrangeFont(key)
		// 灰色背景
		bgGrayFont(key)
		// 黑色背景
		bgBlackFont(key)
		// 蓝色背景
		bgBlueFont(key)
		// 红色背景
		bgRedFont(key)
		// 黄色背景
		bgYellowFont(key)
		// 青色背景
		bgCyanFont(key)
		// 绿色背景
		bgGreenFont(key)
	}
}

// 白色背景对应的字体颜色
func bgWhiteFont(name string) {
	//白色背景，字体：黑色，深蓝色，棕色
	bools := strings.Contains(name, "白色")
	if bools {
		bgSe := colorMap2[name]
		tem1 := colorMap2["黑色"]
		tem2 := colorMap2["深蓝色"]
		tem3 := colorMap2["棕色"]
		result := append(tem1, tem2...)
		result = append(result, tem3...)
		for _, value := range bgSe {
			backgroundFontColorMap[value] = result
		}
	}
}

func bgBrownFont(name string) {
	//     * 棕色背景，字体：红色、蓝色
	//     * 浅棕色背景，字体：红色、蓝色
	//     * 深棕色背景，字体：白色
	bools := strings.Contains(name, "棕色")
	if bools {
		bgSe := colorMap2[name]
		var fontSe []string
		switch name {
		case "棕色", "浅棕色":
			tem1 := colorMap2["红色"]
			tem2 := colorMap2["蓝色"]
			fontSe = append(tem1, tem2...)
		case "深棕色":
			fontSe = colorMap2["白色"]
		}
		for _, value := range bgSe {
			backgroundFontColorMap[value] = fontSe
		}
	}
}

func bgPinkFont(name string) {
	//     * 粉色背景，字体：白色、橙色、蓝色、黄色
	//     * 浅粉色背景，字体：黑色、蓝色
	//     * 深粉色背景，字体：白色、浅蓝色、黄色
	bools := strings.Contains(name, "粉色")
	if bools {
		bgSe := colorMap2[name]
		var fontSe []string
		switch name {
		case "粉色":
			fontSe = append(fontSe, colorMap2["白色"]...)
			fontSe = append(fontSe, colorMap2["橙色"]...)
			fontSe = append(fontSe, colorMap2["蓝色"]...)
			fontSe = append(fontSe, colorMap2["黄色"]...)
		case "浅粉色":
			fontSe = append(fontSe, colorMap2["黑色"]...)
			fontSe = append(fontSe, colorMap2["蓝色"]...)
		case "深粉色":
			fontSe = append(fontSe, colorMap2["白色"]...)
			fontSe = append(fontSe, colorMap2["浅蓝色"]...)
			fontSe = append(fontSe, colorMap2["黄色"]...)
		}
		for _, value := range bgSe {
			backgroundFontColorMap[value] = fontSe
		}
	}
}

func bgPurpleFont(name string) {
	//     * 紫色背景，字体：黄色、绿色
	//     * 浅紫色背景，字体：黄色、绿色
	//     * 深紫色背景，字体：黄色、绿色
	bools := strings.Contains(name, "紫色")
	if bools {
		bgSe := colorMap2[name]
		var fontSe []string
		fontSe = append(fontSe, colorMap2["黄色"]...)
		fontSe = append(fontSe, colorMap2["绿色"]...)
		for _, value := range bgSe {
			backgroundFontColorMap[value] = fontSe
		}
	}
}

func bgOrangeFont(name string) {
	//     * 橙色背景，字体：浅蓝色、青色、绿色
	//     * 浅橙色背景，字体：蓝色、深绿色、深青色
	//     * 深橙色背景，字体：浅蓝色、浅青色、浅绿色
	bools := strings.Contains(name, "橙色")
	if bools {
		bgSe := colorMap2[name]
		var fontSe []string
		switch name {
		case "橙色":
			fontSe = append(fontSe, colorMap2["浅蓝色"]...)
			fontSe = append(fontSe, colorMap2["青色"]...)
			fontSe = append(fontSe, colorMap2["绿色"]...)
		case "浅橙色":
			fontSe = append(fontSe, colorMap2["蓝色"]...)
			fontSe = append(fontSe, colorMap2["深绿色"]...)
			fontSe = append(fontSe, colorMap2["深青色"]...)
		case "深橙色":
			fontSe = append(fontSe, colorMap2["浅蓝色"]...)
			fontSe = append(fontSe, colorMap2["浅青色"]...)
			fontSe = append(fontSe, colorMap2["浅绿色"]...)
		}
		for _, value := range bgSe {
			backgroundFontColorMap[value] = fontSe
		}
	}
}

func bgGrayFont(name string) {
	// 灰色背景，字体：蓝色、黑色
	bools := strings.Contains(name, "灰色")
	if bools {
		bgSe := colorMap2[name]
		var fontSe []string
		fontSe = append(fontSe, colorMap2["蓝色"]...)
		fontSe = append(fontSe, colorMap2["黑色"]...)
		for _, value := range bgSe {
			backgroundFontColorMap[value] = fontSe
		}
	}
}

func bgRedFont(name string) {
	//	   红色背景，字体：黑色、白色、深黄色、蓝色
	//     *  浅红色背景，字体：黑色、深黄色、深蓝色
	//     *  深红色背景，字体：白色、浅黄色、蓝色
	bools := strings.Contains(name, "红色")
	if bools {
		bgSe := colorMap2[name]
		var fontSe []string
		switch name {
		case "红色":
			fontSe = append(fontSe, colorMap2["黑色"]...)
			fontSe = append(fontSe, colorMap2["白色"]...)
			fontSe = append(fontSe, colorMap2["深黄色"]...)
			fontSe = append(fontSe, colorMap2["蓝色"]...)
		case "浅红色":
			fontSe = append(fontSe, colorMap2["黑色"]...)
			fontSe = append(fontSe, colorMap2["深黄色"]...)
			fontSe = append(fontSe, colorMap2["深蓝色"]...)
		case "深红色":
			fontSe = append(fontSe, colorMap2["白色"]...)
			fontSe = append(fontSe, colorMap2["蓝色"]...)
			fontSe = append(fontSe, colorMap2["浅黄色"]...)
		}
		for _, value := range bgSe {
			backgroundFontColorMap[value] = fontSe
		}
	}
}

func bgBlackFont(name string) {
	// 黑色背景，字体：白色、橙色、浅黄色、浅青色
	bools := strings.Contains(name, "黑色")
	if bools {
		bgSe := colorMap2[name]
		var fontSe []string
		fontSe = append(fontSe, colorMap2["橙色"]...)
		fontSe = append(fontSe, colorMap2["白色"]...)
		fontSe = append(fontSe, colorMap2["浅黄色"]...)
		fontSe = append(fontSe, colorMap2["浅青色"]...)
		for _, value := range bgSe {
			backgroundFontColorMap[value] = fontSe
		}
	}
}

func bgBlueFont(name string) {
	//     * 蓝色背景，字体：橙色、白色、黑色
	//     * 浅蓝色背景，字体：橙色、白色、黑色
	//     * 深蓝背景，字体：橙色、白色、黑色
	bools := strings.Contains(name, "蓝色")
	if bools {
		bgSe := colorMap2[name]
		var fontSe []string
		fontSe = append(fontSe, colorMap2["橙色"]...)
		fontSe = append(fontSe, colorMap2["白色"]...)
		fontSe = append(fontSe, colorMap2["黑色"]...)
		for _, value := range bgSe {
			backgroundFontColorMap[value] = fontSe
		}
	}
}

func bgCyanFont(name string) {
	//        青色背景，字体：白色、黑色、橙色、浅黄色
	//     *  深青色背景，字体：白色、浅黄色
	//     *  浅青色背景，字体：黑色、棕色
	bools := strings.Contains(name, "青色")
	if bools {
		bgSe := colorMap2[name]
		var fontSe []string
		switch name {
		case "青色":
			fontSe = append(fontSe, colorMap2["黑色"]...)
			fontSe = append(fontSe, colorMap2["白色"]...)
			fontSe = append(fontSe, colorMap2["橙色"]...)
			fontSe = append(fontSe, colorMap2["浅黄色"]...)
		case "浅青色":
			fontSe = append(fontSe, colorMap2["黑色"]...)
			fontSe = append(fontSe, colorMap2["棕色"]...)
		case "深青色":
			fontSe = append(fontSe, colorMap2["白色"]...)
			fontSe = append(fontSe, colorMap2["浅黄色"]...)
		}
		for _, value := range bgSe {
			backgroundFontColorMap[value] = fontSe
		}
	}
}

func bgYellowFont(name string) {
	//             *  黄色背景，字体：黑色、红色、绿色
	//     *  浅黄色背景，字体：绿色、紫色
	//     *  深黄色背景，字体：蓝色、白色
	bools := strings.Contains(name, "黄色")
	if bools {
		bgSe := colorMap2[name]
		var fontSe []string
		switch name {
		case "黄色":
			fontSe = append(fontSe, colorMap2["黑色"]...)
			fontSe = append(fontSe, colorMap2["绿色"]...)
			fontSe = append(fontSe, colorMap2["橙色"]...)
		case "浅黄色":
			fontSe = append(fontSe, colorMap2["绿色"]...)
			fontSe = append(fontSe, colorMap2["紫色"]...)
		case "深黄色":
			fontSe = append(fontSe, colorMap2["白色"]...)
			fontSe = append(fontSe, colorMap2["蓝色"]...)
		}
		for _, value := range bgSe {
			backgroundFontColorMap[value] = fontSe
		}
	}
}

func bgGreenFont(name string) {
	//绿色背景，字体：白色、橙色、浅黄色
	//     *  浅绿色背景，字体：黑色、棕色
	//     *  深绿色背景，字体：白色、浅黄色
	bools := strings.Contains(name, "绿色")
	if bools {
		bgSe := colorMap2[name]
		var fontSe []string
		switch name {
		case "绿色":
			fontSe = append(fontSe, colorMap2["白色"]...)
			fontSe = append(fontSe, colorMap2["橙色"]...)
			fontSe = append(fontSe, colorMap2["浅黄色"]...)
		case "浅绿色":
			fontSe = append(fontSe, colorMap2["白色"]...)
			fontSe = append(fontSe, colorMap2["橙色"]...)
		case "深绿色":
			fontSe = append(fontSe, colorMap2["白色"]...)
			fontSe = append(fontSe, colorMap2["浅黄色"]...)
		}
		for _, value := range bgSe {
			backgroundFontColorMap[value] = fontSe
		}
	}
}
